#include "../util/TcpListener.h"
#include "Dsm.h"

#define BUFFER_SIZE 1024

extern "C" {
	#include <sys/time.h>
}

void usage() { 
	cout << "Usage: DsmTimeServer <name-server-port>" << endl;
	exit(1);
}

// Evaluable 3.3.5. (6)

int main(int argc, char** argv) {
	if (argc > 2) { 
		usage(); 
	}
	PracticaCaso::DsmDriver * driver = new PracticaCaso::DsmDriver("127.0.0.1", atoi(argv[1]), "dsm.deusto.es");
	//PracticaCaso::DsmDriver * driver = new PracticaCaso::DsmDriver("127.0.0.1", 1234, "dsm.deusto.es");
	PracticaCaso::DsmData data;
	cout << "Node created with NID: " << driver->get_nid() << endl;
	
	char buffer[100];
	struct timeval tv;
	time_t curtime;
	
	//creamos la variable compartida GLOBAL_TIMESTAMP donde escribiremos y que los clientes leeran 
    try 
    {
		//llamamos a dsm_malloc que crea un bloque en el driver. Asi los clientes podran acceder y leer este bloque
        driver->dsm_malloc("GLOBAL_TIMESTAMP", sizeof(buffer));
        
    } catch (DsmException dsme) 
    {
     
        cerr << "ERROR dsm_malloc(\"GLOBAL_TIMESTAMP\", sizeof(" << sizeof(buffer) << ")): " << dsme << endl;
        exit(1);
    }
	// obtenemos el tiempo (cogido de exampleTime) y lo escribimos mediante el loop infinito cada segundo
	while (1) {
		gettimeofday(&tv, NULL); 
        curtime=tv.tv_sec; 
        strftime(buffer,100,"%d-%m-%Y, %H:%M:%S",localtime(&curtime)); 
        cout << "System date: " << buffer << endl; 
        try { 
			//ponemos el tiempo en la variable
            driver->dsm_put("GLOBAL_TIMESTAMP", (void *)buffer, sizeof(buffer)); 
        } catch (DsmException dsme) { 
            cerr << "ERROR: dsm_put(\"GLOBAL_TIMESTAMP\", buffer, " << sizeof(buffer) << ")): " << dsme << endl; 
            driver->dsm_free("GLOBAL_TIMESTAMP"); 
            exit(1); 
        } 
		// esperamos un segundo hasta actualizar el tiempo otra vez
        sleep(1); 
	}
	driver->dsm_free("GLOBAL_TIMESTAMP");
}